/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.utilidades;

import com.controlador.AnalizadorQuery;
import com.modelo.Campo;
import java.io.FileInputStream;

import java.io.FileOutputStream;
import java.io.StringWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import org.jdom.Document; // contener archivos xml en memoria
import org.jdom.Element;  // esto se refiere a la etiquetas
import org.jdom.input.SAXBuilder; // parser para construir documentos xml en memoria
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter; // es la salidad estandar para xml's en jdmon 
/**
 *
 * @author Raul VB
 */

public class XMLWritter 
{
    private static final String rutaDefault=System.getProperty("user.home")+"\\";
    
    public static boolean crearTabla(String nombreTabla, ArrayList<Campo> campos,String ruta)
    {
        Document doc=new Document();  //Creamos un nuevo Documento
        Element tabla=new Element(nombreTabla);
        doc.setRootElement(tabla);
        Element eCampos= new Element("Campos");
        Element eRegistros=new Element("Registros");
        Element campo;
        for(int i=0; i < campos.size(); i++)
        {            
            campo=new Element(campos.get(i).getNombre());
            campo.setAttribute("tipoDato",campos.get(i).getTipoDato());
            campo.setAttribute("longitud", campos.get(i).getLongitud()+"");
            campo.setAttribute("Null", campos.get(i).isNull()+"");
            eCampos.addContent(campo);
        }
        tabla.addContent(eCampos);
        tabla.addContent(eRegistros);
        XMLOutputter serializer=new XMLOutputter(Format.getPrettyFormat());	
        System.out.println(doc.getRootElement().getName());
        try {
            FileOutputStream fos=new FileOutputStream(ruta+".xml");
            Writer wr=new StringWriter( );	    
            serializer.output(doc,fos);
            serializer.output(doc,wr);
            String EstructuraXML=wr.toString();
            System.out.println(EstructuraXML);
            fos.close();
            return true;
            
        }catch(Exception e)
        {
            System.out.println("Ocurrio un error. "+e+"\nEl archivo se intento guardar en "+System.getProperty("user.home")+"\\"+nombreTabla+".xml");
            e.printStackTrace();
            return false;
        }        
    }
    
    public static void crearXML(Element raiz,String archivo)
    {
        XMLOutputter serializer=new XMLOutputter(Format.getPrettyFormat());	
        Document doc= new Document();
        doc.addContent(raiz);
        try 
        {
            FileOutputStream fos=new FileOutputStream(archivo+".xml");
            Writer wr=new StringWriter( );	    
            serializer.output(doc,fos);
            serializer.output(doc,wr);
            String EstructuraXML=wr.toString();
            System.out.println(EstructuraXML);
            fos.close();
            
        }catch(Exception e)
        {
            System.out.println("Ocurrio un error. "+e+"\nEl archivo se intento guardar en "+System.getProperty("user.home")+"\\"+archivo+".xml");
            e.printStackTrace();
            
        }        
    }
    
    
    //
    
    public static boolean agregarRegistro(String nombreTabla,String ruta,ArrayList<Campo> registros)
    {
        SAXBuilder builder = new SAXBuilder(false);
        //builder.setValidation(false); // se activa la validacion con la dtd
        Document doc=null; 
        try
        {
            doc =builder.build(new FileInputStream(ruta+nombreTabla+".xml"));            
        }catch(Exception e)
        {
            
        }
        System.out.println("Documento validado correctamente");
        Element tabla=XMLReader.obtenerTabla(nombreTabla,ruta);
        
        
        System.out.println(tabla.getName()+"Agregar registro nombre tabla");
        
        if(tabla.getChild("Campos")!=null)
        {
            System.out.println("No son nulos los campos");
        }
        
        Element Eregistros;
        if(tabla.getChild("Registros")!=null)
        {
            Eregistros=tabla.getChild("Registros");
        }
        else
        {
            System.out.println("Es nulo registros");
            Eregistros=new Element("Registros");
        }
        Eregistros.detach();
        Element registro=new Element("Registro");//////////////////////////
        Element campo;
        for(int i=0; i< registros.size(); i++)
        {            
            campo=new Element(registros.get(i).getNombre());
            campo.setText(registros.get(i).getContenido());
            //campo.setAttribute("contenido",registros.get(i).getContenido());  
            registro.addContent(campo);
        }
        Eregistros.addContent(registro);
        tabla.addContent(Eregistros);
        doc.removeContent();
        
        XMLWritter.crearXML(tabla,ruta+nombreTabla);
        return true;
        
        
        
    }
    //DELETE FROM TABLA WHERE CAMPO=VALOR
    public static void eliminarRegistro(String tabla,Campo Condicion,String ruta,String simbolo)
    {
        Element rootTabla=XMLReader.obtenerTabla(tabla,ruta);
        List<Element> registros= rootTabla.getChild("Registros").getChildren();
        Campo registro;        
        boolean cadena=false;
        
        System.out.println("VAMOS A ELIMINAR REGISTROS!!\n\n\n");
        try
        {
            Integer.valueOf(Condicion.getContenido());
            cadena=false;
        }catch(Exception e)
        {
            cadena=true;
        }
        Element elemento;
        int size=registros.size();
        ArrayList<Element> eliminados=new ArrayList<Element>();
        if(simbolo.equals("=") && cadena)
        {
            for(int j=0; j < size;j++)
            {
                elemento=registros.get(j);//Obtenemos el registro j
                registro=new Campo(registros.get(j).getChild(Condicion.getNombre()).getName(),elemento.getChild(Condicion.getNombre()).getText());//Creamos un objeto del registro tomando los valores que nos importan
                //System.out.println("/////////////////////////\n"+registro.toString());//Prueba
                //System.out.println(Condicion.getContenido()+"\n/////////////////////////////////\n");//Prueba
                if(registro.getContenido().equals(Condicion.getContenido()))
                {
                    eliminados.add(elemento);//Agregamos los registros a eliminar
                }
            }
        }
        for(int i=0; i < eliminados.size(); i++)
        {
            eliminados.get(i).detach();//Eliminamos el vinculo con la tabla de cada registro
        }
        //FIN DE BUSQUEDA Y ELIMINACION.
        
        XMLWritter.crearXML((Element)rootTabla.clone(), rutaDefault+tabla);
        
        
    }
    
    //UPDATE TABLA SET CAMPO=VALOR WHERE CAMPO=VALOR
    public static void actualizarRegistros(String tabla, ArrayList<Campo> camposActualizar , Campo Condicion,String simbolo,String ruta)
    {
        Element rootTabla=XMLReader.obtenerTabla(tabla,ruta);
        List<Element> registros= rootTabla.getChild("Registros").getChildren();
        Campo registro;        
        boolean cadena=false;
        
        System.out.println("VAMOS A ACTUALIZAR REGISTROS!!\n\n\n");
        try
        {
            Integer.valueOf(Condicion.getContenido());
            cadena=false;
        }catch(Exception e)
        {
            cadena=true;
        }
        Element elemento;
        int size=registros.size(); 
        ArrayList<Element> eliminados=new ArrayList<Element>();
        if(simbolo.equals("=") && cadena)
        {
            for(int j=0; j < size;j++)
            {
                elemento=registros.get(j);//Obtenemos el registro j
                registro=new Campo(registros.get(j).getChild(Condicion.getNombre()).getName(),elemento.getChild(Condicion.getNombre()).getText());//Creamos un objeto del registro tomando los valores que nos importan
                //System.out.println("/////////////////////////\n"+registro.toString());//Prueba
                //System.out.println(Condicion.getContenido()+"\n/////////////////////////////////\n");//Prueba
                if(registro.getContenido().equals(Condicion.getContenido()))
                {
                    for(int i=0; i < camposActualizar.size(); i++)
                    {
                        elemento.getChild(camposActualizar.get(i).getNombre()).setText(camposActualizar.get(i).getContenido());
                    }
                }
            }
        }        
        //FIN DE BUSQUEDA Y CORRECCION
        
        XMLWritter.crearXML((Element)rootTabla.clone(), rutaDefault+tabla);
    }
    
    
    public static void obtenerRegistros(String tabla,ArrayList<Campo> camposSeleccionados)
    {
        
    }
    
    
    
    public static void main(String []args)
    {
        /*ArrayList<Campo> campos=new ArrayList<Campo>();
        Campo campo= new Campo("Nombre","varchar",50,false);
        Campo campo1= new Campo("Apellido_P","varchar",50,false);
        Campo campo2= new Campo("Apellido_M","varchar",50,false);
        campos.add(campo);
        campos.add(campo1);
        campos.add(campo2);
        XMLWritter.crearTabla("ALUMNO",campos,System.getProperty("user.home")+"\\ALUMNO");
        ArrayList<Campo> elemento=XMLReader.obtenerPropiedadesTabla(System.getProperty("user.home")+"\\ALUMNO");        
        for(int i=0; i < elemento.size();i++)
        {
            System.out.println(elemento.get(i).getNombre());
        }
        campos.clear();
        campo= new Campo("Nombre","RAUL23");
        campo1= new Campo("Apellido","Vivanco");
        campo2= new Campo("Edad","18");
        campos.add(campo);
        campos.add(campo1);
        campos.add(campo2);
        XMLWritter.agregarRegistro(System.getProperty("user.home")+"\\CUSTOMER", campos);
        //Campo campoCondicion=new Campo("Nombre","Raul1");
        //XMLWritter.eliminarRegistro("CUSTOMER",campoCondicion ,rutaDefault , "=");*/
        //AnalizadorQuery.select("select FirstName,LastName from Customer where FirstName='Raul1' or Address='SanAndres'",rutaDefault);
    }
}
